package org.robot.scm.platform.monitor;

import com.google.common.collect.Lists;
import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;
import java.util.Date;
import java.util.List;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.robot.scm.platform.AbstractMonitor;
import org.robot.scm.pojos.BaseNotify;
import org.robot.scm.pojos.config.BaseConfig;
import org.robot.scm.pojos.enums.PlatformEnum;
import org.robot.scm.pojos.platform.Clean3BaseNotify;
import org.robot.scm.utils.DateTool;

/**
 * 数据清洗提醒
 */
@Slf4j
public class Clean3NoticeMonitor extends AbstractMonitor {


    @Override
    public PlatformEnum getPlatform() {
        return PlatformEnum.CLEAN3;
    }

    @SneakyThrows
    @Override
    public BaseNotify doMonitor(BaseConfig config) {
        // 当前是否1～3号
        LocalDate currentDate = LocalDate.now();
        int dayOfMonth = currentDate.getDayOfMonth();
        if (dayOfMonth > 3) {
            return null;
        }

        String template = "【凌晨清理】02、03、04、06、18\n"
                + "【下午清理】15、16、17\n"
                + "【当前分区】p%s月分区 / p%s日分区\n"
                + "  保留3个月, 清理月分区 %s\n"
                + "  保留1个月, 清理月分区 %s\n"
                + "  保留3个月, 清理天分区 %s\n"
                + "  保留1个月, 清理天分区 %s\n"
                + "  保留3个月, 清理时间 < %s\n"
                + "  保留1个月, 清理时间 < %s";
        String[] dayArr = clearPartitionDay(4).split(",");
        String dayClean = dayArr[0] + " ~ " + dayArr[dayArr.length - 1];
        String[] dayOneArr = clearPartitionDay(2).split(",");
        String dayOneClean = dayOneArr[0] + " ~ " + dayOneArr[dayOneArr.length - 1];
        String message = String.format(template, monthOfYear(), dayOfYear(), clearPartitionMonth(4), clearPartitionMonth(2), dayClean, dayOneClean, clearDate(3), clearDate(1));
        return Clean3BaseNotify.builder()
                .message(message)
                .createDay(DateTool.format(new Date(), DateTool.PATTERN_5))
                .build();
    }

    public static String clearDate(int previousMonth) {
        LocalDate threeMonthsAgo = LocalDate.now().minusMonths(previousMonth);
        LocalDate firstDayOf = threeMonthsAgo.with(TemporalAdjusters.firstDayOfMonth());
        return firstDayOf.toString();
    }

    public static String dayOfYear() {
        return String.valueOf(LocalDate.now().getDayOfYear());
    }

    public static String monthOfYear() {
        return String.valueOf(LocalDate.now().getMonthValue());
    }

    /**
     * 月分区：p1, 保留3个月, 如：今天是5月清理, 保留3个月的数据，就是4、3、2，清理1月的数据
     *
     * @param previous 前N个月
     */
    public static String clearPartitionMonth(int previous) {
        LocalDate threeMonthsAgo = LocalDate.now().minusMonths(previous);
        return "p" + threeMonthsAgo.getMonth().getValue();
    }

    /**
     * 此方法为上个月以及之前的天数据，不会计算当月的天数据
     *
     * @param previous 前N个月
     */
    public static String clearPartitionDay(int previous) {

        // 如今天是5月3日发起清理任务，保留的是2、3、4，清理的是1月份数据，下面输出1月31日在一年中的第31天
        LocalDate monthsAgo = LocalDate.now().minusMonths(previous);

        // 1月1日
        LocalDate firstDayOfMonth = monthsAgo.with(TemporalAdjusters.firstDayOfMonth());
        int firstDayOfYear = firstDayOfMonth.getDayOfYear();

        // 1月31日
        LocalDate lastDayOfMonth = monthsAgo.with(TemporalAdjusters.lastDayOfMonth());
        int lastDayOfYear = lastDayOfMonth.getDayOfYear();

        List<String> result = Lists.newArrayList();
        for (int i = firstDayOfYear; i <= lastDayOfYear; i++) {
            result.add("p" + i);
        }

        return String.join(",", result);
    }

    public static void main(String[] args) {
        String template = "【凌晨清理】02、03、04、06、18\n"
                + "【下午清理】15、16、17\n"
                + "【当前分区】p%s月分区 / p%s日分区\n"
                + "  保留3个月, 清理月分区 %s\n"
                + "  保留1个月, 清理月分区 %s\n"
                + "  保留3个月, 清理天分区 %s\n"
                + "  保留1个月, 清理天分区 %s\n"
                + "  保留3个月, 清理时间 < %s\n"
                + "  保留1个月, 清理时间 < %s";
        String[] dayArr = clearPartitionDay(4).split(",");
        String dayClean = dayArr[0] + " ~ " + dayArr[dayArr.length - 1];
        String[] dayOneArr = clearPartitionDay(2).split(",");
        String dayOneClean = dayOneArr[0] + " ~ " + dayOneArr[dayOneArr.length - 1];
        String message = String.format(template, monthOfYear(), dayOfYear(), clearPartitionMonth(4), clearPartitionMonth(2), dayClean, dayOneClean, clearDate(3), clearDate(1));
        System.out.println(message);
    }

    public static void test() {
        // 当前月7月1日
        // 183
        System.out.println(LocalDate.now().getDayOfYear());
        // 上1个月6月
        // p153,p154,p155,p156,p157,p158,p159,p160,p161,p162,p163,p164,p165,p166,p167,p168,p169,p170,p171,p172,p173,p174,p175,p176,p177,p178,p179,p180,p181,p182
        System.out.println(clearPartitionDay(1));
        // 上2个月5月
        // p122,p123,p124,p125,p126,p127,p128,p129,p130,p131,p132,p133,p134,p135,p136,p137,p138,p139,p140,p141,p142,p143,p144,p145,p146,p147,p148,p149,p150,p151,p152
        System.out.println(clearPartitionDay(2));
        // 上3个月4月
        // p92,p93,p94,p95,p96,p97,p98,p99,p100,p101,p102,p103,p104,p105,p106,p107,p108,p109,p110,p111,p112,p113,p114,p115,p116,p117,p118,p119,p120,p121
        System.out.println(clearPartitionDay(3));
        // 上4个月3月
        // p61,p62,p63,p64,p65,p66,p67,p68,p69,p70,p71,p72,p73,p74,p75,p76,p77,p78,p79,p80,p81,p82,p83,p84,p85,p86,p87,p88,p89,p90,p91
        System.out.println(clearPartitionDay(4));
    }
}
